package com.java.java网络.exercise;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * tcp字节流 - 服务端 交互
 * 服务端可以接收多个客户端的请求，即实现多客户端通信，向客户端发送消息
 */
public class NetExeS {
    public static void main(String[] args) throws IOException {
        // 思路：客户端向服务端发送请求数据
        // 1.在本机9999端口监听，等待连接---前提该端口没有被占用
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器端已启动，等待连接");
        // 2.当没有客户端连接9999端口时，程序会阻塞，等待连接
        // 如果有客户端连接，则会返回一个socket对象，程序继续
        Socket socket = serverSocket.accept();
        System.out.println("客户端连接成功" + socket.getClass());
        // 3.通过socket.getInputStream()读取客户端写入的数据
        InputStream inputStream = socket.getInputStream();
        // 4.读取客户端写入的数据
        byte[] bytes = new byte[1024];
        int read = 0;
        while ((read = inputStream.read(bytes)) != -1){
            System.out.println("读取到的客户端数据：" + new String(bytes, 0, read));
        }

        // 5+.客户端接收服务端的响应数据
        /*
         *  获取输出流getOutputStream，
         *  写数据outputStream.write
         *  设置结束标记：结束标记，结束标记是 socket.shutdownOutput();
         *  关闭流对象和socket, 必须关闭
         */
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("Hello,Client".getBytes());
        socket.shutdownOutput();// 设置结束标记
        System.out.println("结束标记");

        // 6.关闭流
        outputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}
